﻿// base16.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <vector>
using namespace std;

//编码表
static const string base16_enc_tab{ "0123456789ABCDEF" };

int main()
{
    string teststr = "测试用于base16的字符串";
    string base16str; //base16编码后的字符串
    cout << "ori: " << teststr << endl;
    for (unsigned char c : teststr)
    {
        //一个字节拆分成两个数字=>转为base16字符
        //0100 0001>>4 = 0000 0100 => 4 => '5'
        char h = c >> 4;
        //0100 0001 & 0000 1111 => 0000 0001 => 1 => '1'
        char l = c & 0b00001111;
        base16str += base16_enc_tab[h];
        base16str += base16_enc_tab[l];
    }
    cout << "Base16:\t" << base16str << endl;

    string ostr; //base16解码后数据
    // 'A' => 65, '0'=> 48
    const vector<char> base16_dec_tab{
        -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, //0~9
        -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, //10~19
        -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, //20~29
        -1,-1,-1,-1,-1, -1,-1,-1,-1,-1, //30~39
        -1,-1,-1,-1,-1, -1,-1,-1,       //40~47
        0,1,2,3,4,5,6,7,8,9,            //48~57
        -1,-1,-1,-1,-1, -1,-1,          //58~64
        10,11,12,13,14,15               //65~70
    };
    for (int i = 0; i < base16str.size(); i += 2)
    {
        //获取高位地位字符
        //定义char类型，就可以把'A'转为65
        char ch = base16str[i];
        char cl = base16str[i + 1];

        // 'A' => 65 => 10
        unsigned char h = base16_dec_tab[ch];
        unsigned char l = base16_dec_tab[cl];

        //合并高低位数字
        //h 0100
        //l 0001
        ostr += (h << 4) | l; //h左移4位0100 0000合并地位
    }
    cout << "Base16Decode: " << ostr << endl;

}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
